一默

April 18, 2010

说说GoF模式中的行为模式2

Filed under: Tech — admin @ 12:35 pm

2.Visitor模式
当你把不同的对象比如说String,Float丢到Collection类后,对象都成为Object,
以后遍历的时候如何对不同对象采取不同的操作?if else判断instanceof是最蠢的
办法,visitor模式的想法就是对String,Float等每一个可访问的对象都实现一个
公共接口:
interface CommonOperation {
public void operation(){
}
}
class StringElement implements CommonOperation {
public void operation() {
//自己的操作
}
}

class FloatElement一样
这样遍历collection的时候就可以通过((CommonOperation)iterator.next()).ope
ration()进行操作了,不过这里的缺点是一旦StringElement一定下来,他的操作也
就定了,也就是说客户无法自己更改操作
于是增加一级抽象,引入Visitor接口:
interface Visitor {
public void visitStringElement();
public void visitFloatElement();
}

然后改写CommandOperation和StringElement:
interface CommonOperation {
public void operation(Visitor v){
}
}
class StringElement implements CommonOperation {
public void operation(Visitor v) {
v.visitStringElement();
}
}

这样一来,你要搞不同的操作就实现Visitor接口后在visitXXX方法中实现自己的操
作就可以了
这个模式告诉我们:如果你想对一些对象进行某些公共操作而不怕引进新的类,就
用interface进行抽象(好像有点绕口),其实这也是Command,Strategy,Template Method的思想

说说GoF模式中的行为模式6

Filed under: Tech — admin @ 12:34 pm

6.
CoR模式:
这个好理解,A,B,C,D都实现处理该请求的接口,来了请求后A先看自己能不能处理
,不能就
丢给下一个,下一个不能处理继续丢给下一个……

interface Request {
public void action();
}
class ACanHandleRequest {
public void action() {
}
}
interface Hanlder {
public void handle(Request request);
}
class A implement Handler {
private Handler nextHandler;
public void A(Handler next) {
this.nextHandler = next;
}
public void handle(Request req) {
if (req instanceof ACanHanleReqeust)
req.action();
else
next.handle(req);
}
}

责任链上的下一个Handler可以通过当前Handler的构造指定或是提供一个set方法指

Mediator模式:
中介,这个很形象,抽象一个中介者出来,负责所有相关对象的交互,比如A想要向
B借钱,A先向中介说我要向B借钱,中介找B借钱,然后把钱返回给A,B向A借钱一样

interface Mediator {
A向B借钱();
B向A借钱();
}
class A {
Mediator m;
向B借钱(Mediator m) {
m.A向B借钱();
}
}
class B {
Mediator m;
向A借钱(Mediator m) {
m.B向A借钱();
}
}

然后一个具体类实现Mediator接口实现两个借钱方法,这有点像数据库里面的多对多
关系要抽象出三个表来,变成两个一对多,消除冗余
Interpreter:
这个没看,平时也不用,主要用来对语言的分析,看着就头大……
State:
主要用于状态转换比较复杂的地方,比如现在如果是a->b->c->d四个状态的转换,
平时都是if状态是a,状态转成b,if状态是b,状态转成c,if状态是c,状态转成d,而State模式把这几个State封装成类,然后由统一的转换管理器管理:

interface State {
public void next(Manager m);
public void previouse(Manager m);
}
class AState implements State {
public void next(Manager m) {
m.setState(new XState());
}
public void previouse(Manager m) {
m.setState(new XState());
}

BState,CState,DState……一样

class Manager {
private State state;
public void setState(State state) {
this.state = state;
}
public void next() {
state.next();
}
public void previouse() {
state.previouse();
}
}

这样我们通过Manager设定一个初始的state,然后通过next,previous就可以进行
状态转换,而具体next,previous是哪个状态由具体的AState,BState等指定

说说GoF模式中的行为模式5

Filed under: Tech — admin @ 12:31 pm

5.Observer模式
这个java类库已经实现了框架,不过我觉得自己实现也很简单:

//对事件感兴趣就实现这个接口,里面的action方法是对该事件的处理过程

interface Listener {
public void action();
}

//这就是具体的事件产生类,通过notifyListeners通知对事件感兴趣的类

class EventProducer {
List list = new ArrayList();
public void addListener(Listener l) {
list.add(l);
}
public void notifyListeners() {
for(Iterator i = list.iterator();i.hasNext();i++)
i.action();
}
}

是不是感觉有点熟悉,嘿,Swing里面组件的事件通知原理就是这样子的,比如
JButton就是这里的EventProducer,ActionListener就是这里的Listener,我们对
点击Button事件感兴趣就实现ActionListener接口,写自己的actionPerform方法
(这里的action方法)如果EventProducer可以产生不同的Event怎么区别?那就在
Listener的action方法加一个Event参数:

interface Listener {
public void action(Event e);
}

这下子就和swing里面的没什么区别了,呵呵

说说GoF模式中的行为模式4

Filed under: Tech — admin @ 12:30 pm

4.Memento模式
这个我觉得也太简单了…………就是在内存中保存一份原来状态的copy,待实例修
改了状态后可以回到以前的状态,完全和面向对象没啥关系
class A {
private int n;
private class CopyOfA {
private int n;
public CopyOfA(A a) {
n = a;
}
}
public CopyOfA getCopy() {
return new CopyOfA(this);
}
public void setCopy(CopyOfA a) {
this.n = a.n;
}
}

看吧,就这么简单,你要保存对象状态的时候就getCopy(),啥时候要恢复就setCop
y()而且你也应该注意到了对不同的类都要撰写不同的CopyOfX,累~用的时候还导致内存的大量使用……

说说GoF模式中的行为模式3

Filed under: Tech — admin @ 12:20 pm

3.Iterator模式
这个虽然叫Iterator,不过更深一步看原理如下:
想要对类A,B,C,D实现一些公共操作,比如是push,pull,并不一定要在A,B,C,D中
实现push,pull,而是在A,B,C,D中实现一个方法:

class A {
……
public Operation getOperation() {
return new Operation(this);//呆会儿解释为什么要传this参数
}
……
}

这里的Operation是一个接口,里面放的就是A,B,C,D要实现的一些公共操作

interface Operation {
public void push();
public void pull();
}

然后写一个具体的操作类:

class ConcreteOperation Operation {
public ConcreteOperation(A a) {
this.a = a;
}
public void push() {
操作a
}
public void pull() {
操作a
}
}

需要留意的一点就是ConcreteOperation里面要有A的一个引用,因为iterator模式
的思想是把公共的操作分离到接口(这里的Operation),如果具体操作类里面没有
A的引用,如何操作?这也是A的getOperation方法要传this的原因.
这里我们看到了另外一种接口分离的方法,前面的Command模式之类的都是把公共操作放到一个公共接口,然后A,B,C,D要实现该接口,而这里是A,B,C,D返回实现接口的一个具体类,可以具体体会一下

说说GoF模式中的行为模式1

Filed under: Tech — admin @ 12:11 pm

看了一下午行为模式,说点自己的看法,不对的地方欢迎大家指正
GoF23种模式种行为模式有:
CoR,Command,Interpreter,Iterator,Mediator,Memento,Observer,State,Strateg
y,Template Method,Visitor
1.Command vs Strategy vs Template Method
这三个虽然叫法不同,不过从实现上都是通过abstract class或者interface进行隔
离,所以我觉得实际应用中具体没有什么区别:
interface AbstractOperation {
public void operation();
}
class ConcreteOperation1 implements AbstractOperation {
public void operation() {
自己的操作
}
}

ConcreteOperation2一样

Xserver Xclinet XDM,看了两天的howto文档

Filed under: Tech — admin @ 12:03 pm

对于linux启动后怎么进入图形界面一直不是很清楚,这两天拿着相关的资料狂看,总算入门了。

linux上面的图形界面一般是使用的X Window System,是采用的C/S的结构,有Xserver和Xclient之分,Xserver常用的就是free的XFree86,而我们平常用的图形界面下的程序就是client,如xterm,rxvt,firefox。Xserver负责的是管理机器上面的显示器,键盘,鼠标等输入输出设备,而client只是简单的告诉server要干什么,比如说你启动xterm的时候,就是在告诉server我要一个窗口,于是server就在屏幕上面画一个窗口(当然没这么简单,大致原理如此)。这种c/s得结构使得我们可以把Xserver和Xclien安装在不同的机器上面,后面可以看到。

搞清楚了server和client的关系后,再看看window manager(WM),xdm,xfce,gnome,kde之类的。WM只是负责管理窗口的,比如说最大化,最小化,窗口的重叠,怎么激活一个窗口,怎么把窗口放在最前面……WM也是一个clinet程序。xdm是X Display Manager的全称,简单来说就是图形版的login程序,负责显示图形登陆界面,当然不只是这个作用,还有个最主要的就是做为一个XDMCP的server。而xfce,gnome,kde则是一整套桌面系统(当然也全部是client),含有很多组件,比如说文件管理器,面板管理器等等,也包括wm和相应的xdm的实现。

下面来看看一般的图形界面是怎么启动起来的。一般来说,一个装用linux系统的电脑都会把Xserver和Xclient在一台机器上面启动。进入图形界面有两种方式:一种是先在文本方式下面login后用startx启动,startx会接着调用xinit,xinit主要干两件事情,用xserverrc脚本启动Xserver,用xinitrc脚本启动相应的client程序(最简单的就是启动一个xterm,或是启动一个wm,或是启动gnome,kde之类的DE);第二种方式就是系统启动后期直接运行xdm提示登陆界面(我们平时的常用方式),然后输入用户和密码后进入系统。用xdm的方式启动也是先启动Xserver后显示登陆界面(登陆界面也是图形界面,所以必须要启动Xserver先),验证用户后启动相应的client程序。

关于xdm的启动方式,想多说两句,平常基本都是用这种方式启动的。xdm的配置文件都在/etc/X11/xdm下面,xdm-config配置其他配置文件的位置,Xservers配置xdm启动的Xserver,Xaccess配置允许login的主机名。前面说过xdm的另外一个作用是可以作为XDMCP服务器,Xaccess就是配置这个权限的。由于平时我们都是把Xserver和xdm装在一台机器上面,所以没有什么感觉。其实我们可以用一台486的机器A只安装Xserver,甚至连硬盘都不用,专门负责显示(通常这叫X Terminal),而另外一台专门作运算的高档机器B上面安装xdm(不用安装Xserver),A可以通过XDMCP协议连接B的xdm程序,在A上面显示图形登陆界面,login之后在B上面运行程序,程序的界面则在A上面显示(因为A上面安装的是Xserver)。有人会问那岂不是每台安装Xserver的机器都可以连接B后显示登陆界面?xdm的Xaccess文件就是管这个的。这里要注意的是XDMCP不是一个安全协议,也就是说你通过A登陆B的过程中,所有的userid和password都是以明文传输的,这样很不安全,可以通过ssh的方式解决。

上面的东西都是linux howto上面看到的,具体就是X Window User Howto,X Window Overview Howto,Remote X Apps Howto,XDMCP Howto,XDM Xterm Howto…,可以在http://www.plinux.org/LDP/上面下到。

Powered by WordPress